package persistencia.pruebas;

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.BufferedReader;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import persistencia.IAlmacen;
import persistencia.IEnsamblador;
import persistencia.IGondola;
import persistencia.compartido.Tipo;
import persistencia.csv.AlmacenCSV;
import persistencia.excepciones.StringDeConexionIncompatible;

import compartido.IEntidad;

public class TestPersistencia {

	IAlmacen almacen;
	
	@Before
	public void setUp() throws Exception {
		File f = new File("./src/persistencia/csv/pruebas/EntidadEjemplo.csv");
		if (f.exists())
			f.delete();
		f = null;
	}

	@After
	public void tearDown() throws Exception {
		File f = new File("EntidadEjemplo.csv");
		if (f.exists())
			f.delete();
		f = null;
	}

	@Test
	public void testAlmacenarEntidadYVolverACargarla() {
		IAlmacen almacen = new AlmacenCSV();
		try {
			almacen.abrir("csv:./src/persistencia/csv/pruebas");
		} catch (StringDeConexionIncompatible e1) {
			fail ("No se conecta correctamente, mediante un string de conexión valido.");
		}
		
		IEnsamblador ensamblador = new EnsambladorEjemplo();
		Tipo<IEntidad> te = new Tipo<IEntidad>(EntidadEjemplo.class);
		
		almacen.registrarEnsamblador(te,ensamblador);
		
		EntidadEjemplo ejemplo = new EntidadEjemplo("Uno","Arquero");
		
		IGondola gondola = almacen.crearGondola(te);
		gondola.agregar(ejemplo);
		gondola.guardar();
		
		almacen.cerrar();
		
		System.gc();
		
		try {
			almacen.abrir("csv:./src/persistencia/csv/pruebas");
		} catch (StringDeConexionIncompatible e1) {
			fail ("No comprende correctamente la segunda vez que intenta conectarse.");
		}
		
		gondola = almacen.crearGondola(te);
		EntidadEjemplo copia = (EntidadEjemplo)gondola.obtener("Uno");
		
		if (copia.toString().compareTo(ejemplo.toString()) != 0)
			fail ("No se puede recuperar una entidad almacenada.");
		
		try {
			BufferedReader bf = new BufferedReader(new FileReader("./src/persistencia/csv/pruebas/"+te.getNombre()+".csv"));
			
			String linea = bf.readLine();
			if ((linea==null) || (linea.compareTo("id,atributo") != 0))
				fail("No se lee  correctamente el encabezado.");
			linea = bf.readLine();
			if ((linea==null) || (linea.compareTo(ejemplo.toString()) != 0))
				fail("No se agrega el unico elemento a la gondola.");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		}
}
